Die internen Ports des HD64180 Helmut Bernhardt Sämtliche gegenüber dem Z80 zusätzlich im HD64180 zur Verfügung ge- stellten Leistungen sind über Portadressen zu programmieren. Für diese internen Ports der CPU wird ein I/O-Adreßbereich von 3FH Ports ver- braucht. Wie prinzipiell auch schon beim Z80 kann mit dem HD64180 ein I/O- Adreßraum von 64K-Ports differenziert werden. Beim Z80 werden dafür ausschließlich die Befehle IN A,(C) und OUT (C),A sinnvoll sein. Bei diesen Befehlen werden die Inhalte der Register C (AO-A7) und B (A8-A15) als Adressen auf den Bus gelegt. Bei den normalen In- und OUT - Befehlen mit Ausgabe einer 8Bit-Portaddesse im Befehlsoperanden wird der Inhalt des Accu auf A8-A15 des Adressbus gelegt. Diese Befehle sind in Sytemen, deren I/O-Adreßdecoding auf 16Bit-Adressen aufbaut nicht verwendbar. Die internen Ports des HD64180 liegen in der Zero-Page (A8-A15 sind low) des 64K-Adreßdreßraums. Um diese internen Ports zu lesen und zu schreiben, hat der HD64180 spezielle Befehle, die automatisch A8-A15 low ausgeben, wenn auf die internen Ports zugegriffen wird. Traditionsbedingt decodieren aber sämtliche I/O-mapped Periherie- Geräte für Z80-Systeme nur A0-A7 und beschränken den I/O-Adreßraum damit auf 256 Ports. Diese Baugruppen fühlen sich bei Zugriffen auf die internen Ports ebenfalls angesrochen, wenn ihre 8Bit-Adresse mit der zero-Page-Adresse des angesprochenen internen Ports übereinstimmt. Beim Lesen eines internen Ports werden deshalb die Datentreiber des HD64180-Chips zur Umwelt geschlossen, so daß keine Kollisionen von internen und externen Daten möglich sind. Beim Schreiben gelangen aber die Daten, die für die internen Ports bestimmt sind, auch nach außen und werden von einem auf gleicher Adresse liegenden externen Port auch vereinnahmt. Verrückt spielende Peripherie-Geräte wären die Folge, wenn nicht noch eine zusätzliche Sicherung im HD6418O eingebaut wäre. Der zusammenhängende Adreßbereich von 3FH Zero-Page-Ports für die Register des HD64180 beginnt default bei 00H. Durch Ändern der Bits 7 und 6 des IRC-Registers (3FH) lassen sich die 3FH Ports innerhalb der Zero-Page verschieben. D7 D6 Adreßbereich der internen Ports --------------------------------------------------- 0 0 00 - 3F (nach RESET) 0 1 40 - 7F 1 0 80 - BF 1 1 C0 - FF --------------------------------------------------- Die im folgenden benutzte Angabe von Portadressen geht davon aus, daß D6 und D7 von ICR beide low sind und die internen Ports bei 00-3F in der Zero-Page liegen. Die relativen Adressen und Funktionen sind in der Tabelle aus dem Prof-180-Handbuch zu ersehen. Mit dieser Tabelle alleine ist man aber noch lange nicht in der Lage, die internen Ports sinnvoll zu programmieren. Vielleicht helfen die folgenden Ausfüh- rungen da weiter: Zunächst seien die Angaben zum IRC-Register, 'I/O Control Register', Port 3H) vervollständigt. D5 (IOSTP) = 0 ermöglicht den normalen Be- trieb der H64180-internen Peripherie-Ports (Einstellung nachRESET). Wenn ISTP auf 1 gesetzt wird, sind die Funktionen von ASC1, CSi/0 und PRT (serielje Schnittstellen und Reload-Timer unterbunden. Damit ein bei 9,26 MHz Taktrate tickender HD64180 auch mit langsamer Perpherie laufen kann, gibt es nicht nur den WAiT-Pin, über den die Peripherie die CPU um Geduld bitten kann; die CPU (und auch die inter- nen DMA-Kanäle) können auch selbständig WAIT-Zyklen einlegen, wobei zwischen memory-mapped I/O und I/O-mapped Zugriffen unterschieden wird. Mit dem oberen Nibble von Port 32H (DCNTL) lassen sich unterschiedliche Anzahlen WAITs einstellen; D7 D6 Anzahl WAITs bei memory mapped Adressierung --------------------------------------------------- 0 0 0 0 1 1 1 0 2 1 1 3 (nach RESET) --------------------------------------------------- Anzahl WAITs bei --------------------------------------------------- D5 D4 I/O Zugriffen /INT0-Acknowledge 0 0 1 2 0 1 2 4 1 0 3 5 1 i 4 6 --------------------------------------------------- Be Zugriff auf die internen Ports werden unabhängig von D5 und D4 keine WAITs eingefügt. Nur für die Datenregister von ASCI, CSI/O und PRT werden je nach Zustand bis zu 4 WAITs für die Synchronisatin mit der CPU eingefügt. Die Bits 0-3 von DCNTL dienen der Steuerung des DMA-Betriebs und werden dort behandelt. RCR, Refresh Control Register, Port 36H Gegenüber dem Hidden Refresh des Z80 während jeden M1-Zyklus' gibt der HD64180 jeweils nach einer bestimmten Anzahl von Taktzyklen eine 8Bit- -Refreshadresse aus. Durch die 8Bit-Adresse können 256K-Bit- und 1M- Bit-Speicher-Chips ohne zusätzliche Refresh-Logik verwendet werden. Ein Refresh erfolgt asynchron zur CPU-Arbeit nach einer über RCR D0 und D1 eingestellten Anzahl von Taktzyklen: D1 D0 Anzahl Takte zwischen zwei Refresh-Zyklen --------------------------------------------------- 0 0 10 0 1 20 1 0 40 1 1 80 --------------------------------------------------- Mit D7 = 0 an RCR wird der Refresh-Controller abgeschaltet (für sta- ttische RAMs kann das Refreshing entfallen. D7= 1 (nach RESET) aktiviert den Refresh-Controller. ##################### Mit D0 läßt sich das Refresh-Timing den Möglichkeiten des Speichers anpassen: D0 = 0 : Refresh ist 2 Taktzyklen lang D0 = 1 : Refresh ist 3 Taktzyklen lang (nach RESET voreingestellt) D2-D5 im RCR-Register haben keine Funktion. ICT, Interrupt/Trap-Register, Port 34H D7 (Trap) wird immer dann von der CPU auf 1 gesetzt, wenn diese auf einen illegalen Befehl gestoßen ist (z.B. undefinierte Z80-Befehle). Durch einen OUT0-Befehl kann D7 wieder auf 0 gesetzt werden (nicht aber auf 1). Nach RESET ist D7=0. Ein illegaler Op-Code löst den für den HD64180 höchst priorisierten Trap-Interrupt aus. Die Service Routine kann dann aus dem Zustand von D6 (UFO) erkennen, ob der Fehler im 2ten oder 3ten Byte des Op-Codes auftrat. D6 erlaubt die Korrektur des beim Trap auf den Stack geretteten Pro- gramm-Counters. Bei D6=0 zeigt der gerettete PC auf das zweite Byte des als falsch erkannten Befehls. Bei D6=1 zeigt der PC auf das 3. Byte des falschen Befehls. D6 kann nur gelesen werden. D0, D1 ubd D2 können zur Maskierung des externen Interrups /INT0, /INT1 und /INT2 verwendet werden. Wenn das entsprechende Bit auf 0 gestzt ist, ist der Interrupt gesperrt: auf 1 gesetzt wird der ent- sprechende Interrupt freigegeben. Nach RESET ist nur /INT0 freige- geben (D0=1) und /INT1 und /INT2 sind gesperrt (D1, D2 = 0). IL, Interrupt Vector Low Register, Port 33H Die externen Interrupts /INT0 im Mode 2 sowie /INT1 und /INT2 grund- sätzlich und alle internen Interrupts werden von Service-Routinen be- dient, deren Startadressen in e3iner Tabelle abgelegt sind. Die Technik ist die des IN2 beim Z80. Im I-Register der CPU werden die oberen 8 Bit (A8-A15) der Adresse der Vector-Tabelle abgelegt. Die unteren 8 Bit der Adresse (Pointer in die Vector-Tabelle) liefert das Interrupt- auslösende Peripherie-Gerät beim Interrupt-Ackowledge über den Daten- bus. Die CPU ignoriert davon D0, um eine gerade Adresse zu erzeugen, und bildet aus den beiden Hälften einen Pointer in die Vectortabelle. Die dort in der Tabelle abgelegte Adresse ist die Startadresse der Service-Routine. Beim HD64180 benötigt nur der /INT0, der dem /INT des Z80 im Mode 2 entspricht, einen extern gelieferten Adreßanteil (A0-A7 uber D0-D7) des Datenbus, um in der Vectortabelle die Adresse der Service-Rou- tine zu finden. Damit können abwechselnd mehrere INT-Quellen über nur einen Interrupt-Eingang der CPU angeschlossen werden. Die Adressen der übrigen Interrupt-Quellen des HD64180 sind (mit gewissen Freiheiten) festgelegt. So stellen die ersten beiden Bytes der Tabelle (Adresse mit A0-A7=0) die Adresse mit der Service-Routine füt /INT1 dar. Die nächsten beiden Bytes liefern den Vektor für /INT2. Die Reihenfolge der Vektoren ist durch die Interrupt-Quellen festgelegt; es läßt sich aber die relative Lage der Gruppe von Vektoren (32 Bytes) innerhalb der 256-Byte-Tabelle in 32-Bytes-Schritten verschieben. Wo diese Adressengruppe relativ in der Tabelle liegt, wird durch D7-D5 des IL-Registers vorgegeben (nach RESET sind diese low und die Gruppe liegt am Anfang der Vektor- -Tabelle). wenn D7-D5 alle low sind, liegen die Vektoren für /INT1, /INT2 und die internen Interrupts ab Adresse XX00H in der Tabelle; wenn D7-D5 das Bitmuster 001 haben, liegen diese Vektoren ab XX20H in der Tabelle; u.s.w Die Bits 0-4 werden von der internen Interrupt-Quelle selbst erzeugt und geben die relative Adresse innerhalb der 32-Byte-Gruppe in der Ta- belle vor. Die Tabelle 2.7.2 des 64180-Handbuchs (die hier ohne freundliche Genehmigung von Hitachi wiedergegeben ist) gibt die Reihenfolge der Einträge für die Interruptquellen und die damit verknüfte Prioritäts-Hirarchie vor. Table 2.7.2 Interrupt Source and Lower Vector -------------------------------------------------- Interrupt- Priority IL Fixed Code -Source b7 b6 b5 b4 b3 b2 b1 b0 /INT1 highest . . . 0 0 0 0 0 /INT2 . . . 0 0 0 1 0 PRT channel 0 . . . 0 0 1 0 0 PRT channel 1 . . . 0 0 1 1 0 DMA channel 0 . . . 0 1 0 0 0 DMA channel 1 . . . 0 1 0 1 0 CSI/0 . . . 0 1 1 0 0 ASCI channel 0 . . . 0 1 1 1 0 ASCI channel 1 lowest . . . 1 0 0 0 0 -------------------------------------------------- Außer den maskierten Interrupts gibt es noch den oben erwähnten Trap, der eine Verzweigung zur logischen Adresse 0000H zur Folge hat. Wenn diese logische Adresse mit der pysikalischen Adresse 0000H identisch ist (Banking), entspricht dies dem /RESET-Vektor. Durch Prüfen von D7 in Port 32H (ICT) kann erkannt werden, ob ein Trap oder ein RESET vorliegt. Ein /NMI bewirkt, wie beim Z80 einen CALL 00066H, wobei auch hier die logische Adresse innerhalb der eingestellten Bank und nicht unbedingt die absolute Adresse 00066H relevant ist. Der /INT0 kennt wie der /INT des Z80 noch die Modi 0 und 1 Mode 0 : Beim Acknowledge wird ein 1Byte-Befehl vom Datenbus gelesen Und ausgeführt (RST XX) Dieses Byte muss die Interrupt-Quelle liefern. Mode 1 : Bei einem Interrupt am /INT0-Pin erfolgt ein RST 38H. Die Adresse 0038H liegt in der per MMU eingestellte Bank (logi- sche Adresse). Weitere Steuerungen der internen Interrupts werden bei der Beschrei- bung der jeweiligen Funktionsgruppen gezeigt. Dazu aber erst im nächs- ten Info. Table 2.5.1 Internal I/O Register Address Map (1) Register Mnemonic Address ASCI ASCI Control Regitser A Ch 0 CNTLA0 00H AStI Control Register A Ch 1 CNTLA1 01H ASCI Control Register B Ch 0 CNTLBO 02H ASCI Control Register B Ch 1 CNTLB1 03H ASCI Status Register Ch 0 STATO 04H ASCI Status Register Ch 1 STAT1 05H ASCI Transmit Data Register Ch 0 TOR0 06H ASCl Transmit Data Register Ch 1 TDR1 07H ASCI Receive Data Register Ch 0 RDR0 08H ASCI Receive DBta Register Ch 1 RDR1 09H CSI/O CSI/O Control Register CNTR 0AH CSI/O Transmit/Receive Data Reister TRDR 0BH Timer Timer Data Register Ch OL TMDROL 0CH Timer Data Register Ch OH TMDROH 0DH Reload Register Ch OL RLDROL 0EH Reload Register Ch OH RLDRoD 0FH Timer Control Register TCR 10H (Reserved) 11H 12H-13H Timer Data Register Ch 1L TMDROL 14H Timer Data Register Ch 1H TMDROH 15H Reload Register Ch 1L RLDROL 16H Reload Register Ch 1H RLDROH 17H Outhers Free Running Counter FRC 18H (Reserved) 19H-1FH DMA DMA Source Address Register Ch OL SAROL 20H DMA Source Address Register Ch OH SAROH 21H DMA Source Address Register th OB SAROB 22H DMA Destination Address Register Ch OL DAROL 13H DMA Destination Address Register Ch OH DAROH 24H DMA Destination Address Register Ch OB DAROB 25H DMA Byte Count Register Ch OL BCROL 26H DNA Byte Count Register Ch OH BCROH 27H DMA Memory Address Register Ch 1L MARIL 28H DMA Memory Address Register Ch 1H MARLH 29H DMA Memory Address Register Ch 1B MARIB 2AH DMA I/O Address Register Ch 1L IAR1L 2BH DMA I/O Address Register Ch 1H IAR1H 2CH (Reserved) 2DH DMA Byte Count Register Ch 1L BCR1L 2EH DMA Byte Count Register Ch 1H BCR1H 2FH DMA Status Register DSTAT 30H DMA Mode Register DMODE 31H DM/WAITE Control Register DCNTL 32H INT IL Register Interrupt Vector Low Reg. 33H INT/TRAP Register 34H (Reserved) 35H Refresh Refresh Control Register RCR 36H (Reserved) 37H MMU MMU Common Base Register CBR 38H MMU Bank Base Register BBR 39H MMU Common/Bank Area Register CBAR 3AH I/O (Reserved) 38H-3EH I/O Control Register ICR 3FH